from PIL import Image, ImageEnhance, ImageOps
import logging

# 配置日志
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s - %(levelname)s - %(message)s')

def adjust_contrast(image, factor):
    """调整图像对比度."""
    logging.info(f"开始调整对比度，因子: {factor}")  # 记录开始信息
    if not isinstance(image, Image.Image):
        logging.error("输入不是 PIL 图像对象")  # 记录错误信息
        print("错误：输入不是 PIL 图像对象")
        return image

    if not isinstance(factor, (int, float)):
        logging.error("对比度因子不是数字")  # 记录错误信息
        print("错误：对比度因子不是数字")
        return image

    try:
        enhancer = ImageEnhance.Contrast(image)
        logging.debug("ImageEnhance.Contrast 对象已创建")  # 记录调试信息
        enhanced_image = enhancer.enhance(factor)
        logging.info("对比度调整完成")  # 记录完成信息
        return enhanced_image
    except ValueError as ve:
        logging.exception(f"值错误: {ve}")  # 记录异常信息
        print(f"值错误: {ve}")
        return image
    except TypeError as te:
        logging.exception(f"类型错误: {te}")  # 记录异常信息
        print(f"类型错误: {te}")
        return image
    except Exception as e:
        logging.exception(f"调整对比度失败: {e}")  # 记录异常信息
        print(f"调整对比度失败: {e}")
        return image  # 返回原始图像，避免程序崩溃

def adjust_brightness(image, factor):
    """调整图像亮度."""
    logging.info(f"开始调整亮度，因子: {factor}")  # 记录开始信息
    if not isinstance(image, Image.Image):
        logging.error("输入不是 PIL 图像对象")  # 记录错误信息
        print("错误：输入不是 PIL 图像对象")
        return image

    if not isinstance(factor, (int, float)):
        logging.error("亮度因子不是数字")  # 记录错误信息
        print("错误：亮度因子不是数字")
        return image

    try:
        enhancer = ImageEnhance.Brightness(image)
        logging.debug("ImageEnhance.Brightness 对象已创建")  # 记录调试信息
        enhanced_image = enhancer.enhance(factor)
        logging.info("亮度调整完成")  # 记录完成信息
        return enhanced_image
    except ValueError as ve:
        logging.exception(f"值错误: {ve}")  # 记录异常信息
        print(f"值错误: {ve}")
        return image
    except TypeError as te:
        logging.exception(f"类型错误: {te}")  # 记录异常信息
        print(f"类型错误: {te}")
        return image
    except Exception as e:
        logging.exception(f"调整亮度失败: {e}")  # 记录异常信息
        print(f"调整亮度失败: {e}")
        return image

def sharpen_image(image, factor):
    """锐化图像."""
    logging.info(f"开始锐化图像，因子: {factor}")  # 记录开始信息
    if not isinstance(image, Image.Image):
        logging.error("输入不是 PIL 图像对象")  # 记录错误信息
        print("错误：输入不是 PIL 图像对象")
        return image

    if not isinstance(factor, (int, float)):
        logging.error("锐化因子不是数字")  # 记录错误信息
        print("错误：锐化因子不是数字")
        return image

    try:
        enhancer = ImageEnhance.Sharpness(image)
        logging.debug("ImageEnhance.Sharpness 对象已创建")  # 记录调试信息
        enhanced_image = enhancer.enhance(factor)
        logging.info("锐化图像完成")  # 记录完成信息
        return enhanced_image
    except ValueError as ve:
        logging.exception(f"值错误: {ve}")  # 记录异常信息
        print(f"值错误: {ve}")
        return image
    except TypeError as te:
        logging.exception(f"类型错误: {te}")  # 记录异常信息
        print(f"类型错误: {te}")
        return image
    except Exception as e:
        logging.exception(f"锐化图像失败: {e}")  # 记录异常信息
        print(f"锐化图像失败: {e}")
        return image

def adjust_color(image, factor):
    """调整色彩饱和度."""
    logging.info(f"开始调整色彩饱和度，因子: {factor}")  # 记录开始信息
    if not isinstance(image, Image.Image):
        logging.error("输入不是 PIL 图像对象")  # 记录错误信息
        print("错误：输入不是 PIL 图像对象")
        return image

    if not isinstance(factor, (int, float)):
        logging.error("色彩饱和度因子不是数字")  # 记录错误信息
        print("错误：色彩饱和度因子不是数字")
        return image

    try:
        enhancer = ImageEnhance.Color(image)
        logging.debug("ImageEnhance.Color 对象已创建")  # 记录调试信息
        enhanced_image = enhancer.enhance(factor)
        logging.info("色彩饱和度调整完成")  # 记录完成信息
        return enhanced_image
    except ValueError as ve:
        logging.exception(f"值错误: {ve}")  # 记录异常信息
        print(f"值错误: {ve}")
        return image
    except TypeError as te:
        logging.exception(f"类型错误: {te}")  # 记录异常信息
        print(f"类型错误: {te}")
        return image
    except Exception as e:
        logging.exception(f"调整色彩饱和度失败: {e}")  # 记录异常信息
        print(f"调整色彩饱和度失败: {e}")
        return image

def adjust_hue(image, angle):
    """调整色调."""
    logging.info(f"开始调整色调，角度: {angle}")  # 记录开始信息
    if not isinstance(image, Image.Image):
        logging.error("输入不是 PIL 图像对象")  # 记录错误信息
        print("错误：输入不是 PIL 图像对象")
        return image

    if not isinstance(angle, int):
        logging.error("色调角度不是整数")  # 记录错误信息
        print("错误：色调角度不是整数")
        return image

    try:
        # 将图像转换为 HSV 颜色空间
        logging.debug("转换为 HSV 颜色空间")  # 记录调试信息
        hsv_image = image.convert("HSV")
        pixels = hsv_image.load()

        width, height = hsv_image.size
        logging.debug(f"图像尺寸: {width}x{height}")  # 记录调试信息

        for x in range(width):
            for y in range(height):
                h, s, v = pixels[x, y]
                # 调整色调值
                h = (h + angle) % 360
                pixels[x, y] = (h, s, v)

        # 转换回 RGB 颜色空间
        logging.debug("转换回 RGB 颜色空间")  # 记录调试信息
        rgb_image = hsv_image.convert("RGB")
        logging.info("色调调整完成")  # 记录完成信息
        return rgb_image
    except ValueError as ve:
        logging.exception(f"值错误: {ve}")  # 记录异常信息
        print(f"值错误: {ve}")
        return image
    except TypeError as te:
        logging.exception(f"类型错误: {te}")  # 记录异常信息
        print(f"类型错误: {te}")
        return image
    except Exception as e:
        logging.exception(f"调整色调失败: {e}")  # 记录异常信息
        print(f"调整色调失败: {e}")
        return image

def adjust_gamma(image, gamma):
    """调整 Gamma."""
    logging.info(f"开始调整 Gamma，Gamma 值: {gamma}")  # 记录开始信息
    if not isinstance(image, Image.Image):
        logging.error("输入不是 PIL 图像对象")  # 记录错误信息
        print("错误：输入不是 PIL 图像对象")
        return image

    if not isinstance(gamma, (int, float)):
        logging.error("Gamma 值不是数字")  # 记录错误信息
        print("错误：Gamma 值不是数字")
        return image

    try:
        # 创建查表法 (LUT)
        logging.debug("创建查表法 (LUT)")  # 记录调试信息
        table = []
        for i in range(256):
            # Gamma 校正公式
            value = int((i / 255.0) ** gamma * 255.0)
            if value < 0:
                value = 0
            elif value > 255:
                value = 255
            table.append(value)

        # 根据图像模式创建 LUT
        logging.debug("根据图像模式创建 LUT")  # 记录调试信息
        if image.mode == "L":
            lut = bytes(table)
        elif image.mode == "RGB":
            lut = bytes(table * 3)  # RGB: 3 通道
        else:
            # 对于其他模式，先转换为 RGB
            logging.warning(f"图像模式为 {image.mode}，转换为 RGB")  # 记录警告信息
            image = image.convert("RGB")
            lut = bytes(table * 3)

        # 应用查表法
        logging.debug("应用查表法")  # 记录调试信息
        adjusted_image = image.point(lut)
        logging.info("Gamma 调整完成")  # 记录完成信息
        return adjusted_image

    except ValueError as ve:
        logging.exception(f"值错误: {ve}")  # 记录异常信息
        print(f"值错误: {ve}")
        return image
    except TypeError as te:
        logging.exception(f"类型错误: {te}")  # 记录异常信息
        print(f"类型错误: {te}")
        return image
    except Exception as e:
        logging.exception(f"调整 Gamma 失败: {e}")  # 记录异常信息
        print(f"调整 Gamma 失败: {e}")
        return image